/*
 *
 * Elaborado por: Roberto Loaeza Valerio.
 * 
 * Proyecto: Aplicación multiplataforma de geomática para sistemas móviles y de escritorio.
 * 
 * Fecha de creación de archivo: 28-marzo-2006
 * 
 */
package main;


import dbClass.Puntos;
import ewe.ui.CellConstants;
import ewe.ui.Control;
import ewe.ui.Editor;
import ewe.ui.InputStack;
import ewe.ui.mChoice;
import ewe.ui.mInput;
import ewe.ui.mTextPad;

/**
 * Lectura NaM, Permite crear/editar una estacion
 * <b>*</b> Incluye conversion automatica de sexagecimal a decimal
 * <b>*</b> Incluye cambio automatico de rumbo a azimut o viceversa
 *  
 * @author roberto
 *
 */
public class LecturaNaM extends Editor{
	
	mInput angulo =new mInput();
	mInput distancia = new mInput();
	mInput azimut = new mInput();
	mTextPad descripcion =new mTextPad(4,8);
	Puntos puntos = new Puntos();
	mChoice norte = new mChoice("N|S",0);
	mChoice este = new mChoice("E|W",0);
	int azimutrumbo;
	double azimut2Rumbo;
	/**
	 * Asigna los valores para editarlos
	 * @param p (Puntos) Contiene los valores a editar
	 */
	public void setValues(Puntos p) {
		angulo.setText(String.valueOf(p.angulo).toString());
		distancia.setText(String.valueOf(p.distancia).toString());
		descripcion.setText(String.valueOf(p.descripcion).toString());		
		norte.selectedIndex= (p.azimut1<90)||(p.azimut1>270)?0:1;
		este.selectedIndex= (p.azimut1<180)?0:1;		
		if(p.azimut1<90)
			azimut2Rumbo=p.azimut1;
		else if(p.azimut1<180)
			azimut2Rumbo=180-p.azimut1;
		else if(p.azimut1<270)
			azimut2Rumbo=p.azimut1-180;
		else if(p.azimut1<360)
			azimut2Rumbo=360-p.azimut1;
		
		if(azimutrumbo==0)
			azimut.setText(String.valueOf(p.azimut1).toString());
		else
			azimut.setText(String.valueOf(azimut2Rumbo).toString());
		puntos = p;
	}
	private boolean valorValido(char val, String patron) {		
		for(int i=0; i<patron.length(); i++)
			if(val==patron.charAt(i))
				return true;
		return false;		
	}
	
	/**
	 * Convierte una cadena con patron de sexagecimal a decimal, en caso de que la
	 * cadena sea decimal se regresa la misma (en double)
	 * @param ang Cadena que contendra el angulo en cuestion (sexagecimal o decimal)
	 * @return Angulo convertido a decimal
	 */
	private double sexagecimal2decimal(String ang) {
		double new_ang=0;		
		boolean esDecimal = true;
		String buffer="";		
		for(int i=0; i<ang.length(); i++) {
			switch(ang.charAt(i)) {
			case 176:
			case 'º' :
				new_ang += Double.parseDouble(buffer);
				buffer="";
				esDecimal=false;
				break;				
			case '\'' :
				new_ang += Double.parseDouble(buffer)/60;
				buffer="";
				esDecimal=false;
				break;
			case '\"' :
				new_ang += Double.parseDouble(buffer)/60/60;
				buffer="";
				esDecimal=false;
				break;
			default:
				if(!valorValido(ang.charAt(i), "1234567890."))
					return 0;
				else
					buffer+=ang.charAt(i);
				break;
			}				
		}				
		return esDecimal?Double.valueOf(ang).doubleValue():new_ang;
	}

	private double validaValor(String valor, String patron) {
		for(int i=0; i<valor.length(); i++)
			if(!valorValido(valor.charAt(i), patron))
				return 0;
		return Double.valueOf(valor).doubleValue();
	}
	/**
	 * Una vez editado los valores puestos por setValues o que haya sido creado como nueva instancia
	 * esta funcion nos permite obtener los nuevos valores (Puntos)
	 * @return Regresa los nuevos valores (Puntos)
	 */
	public Puntos getValues() {		
		puntos.angulo = angulo.getText().length()>0?sexagecimal2decimal(angulo.getText()):0;		
		puntos.distancia=distancia.getText().length()>0?validaValor(distancia.getText(),"0123456789."):0;
		puntos.descripcion = descripcion.getText();	
		azimut.setText(String.valueOf(validaValor(azimut.getText(),"0123456789.-")));
		if(azimut.getText().length()>0) {
			if(this.azimutrumbo==1) {		
				if(norte.getText().equalsIgnoreCase("N")) {
					if(este.getText().equalsIgnoreCase("E")) {
						puntos.azimut1 = Double.valueOf(azimut.getText()).doubleValue();
					} else {
						puntos.azimut1 = 360-Double.valueOf(azimut.getText()).doubleValue();
					}				
				} else {
					if(este.getText().equalsIgnoreCase("E")) {
						puntos.azimut1 = 180-Double.valueOf(azimut.getText()).doubleValue();
					} else {
						puntos.azimut1 = 180+Double.valueOf(azimut.getText()).doubleValue();
					}				
				}
			} else {
				puntos.azimut1 = Double.valueOf(azimut.getText()).doubleValue();
			}	
		}
		else {
			puntos.azimut1 = -1;
		}
		return puntos;
	}
	
	/**
	 * Nos permite capturar/editar una estacion
	 * @param nombreCampos Nombre de los campos (util para multi-idioma)
	 * @param azimutrumbo Tipo de brujula (generalmente asignada en proyecto.azimutrumbo)
	 */
	public LecturaNaM(String [] nombreCampos, int azimutrumbo) {
		this.azimutrumbo = azimutrumbo;
		InputStack is = new InputStack();
		is.inputLength = 5;
		InputStack is2 = new InputStack();
		is.add(angulo, nombreCampos[0]+":");
		is.add(distancia, nombreCampos[1]+":");						
		is.add(descripcion, nombreCampos[2]+":");
		azimut.setText("-1");
		if(azimutrumbo!=0) {
			Control c;	
			c=addField(norte, "norte");			
			is2.addNext(c).setCell(DONTSTRETCH);			
			c=addField(azimut,"azimut");			
			is2.addNext(c).setCell(STRETCH);			
			c=addField(este, "este");
			is2.addLast(c).setCell(DONTSTRETCH);
			is.add(is2, nombreCampos[4]);
		}else {
			
			is.add(azimut, nombreCampos[3]+":");
		}				
				
		addLast(is,CellConstants.HSTRETCH,CellConstants.FILL);				
	}
}
